home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / formats / iff / newiff.lzh / NewIFF / NewIFF.lzh / newiff / modules / getdisplay.c < prev    next >
C/C++ Source or Header  |  1992-05-18  |  5KB  |  212 lines

  1.  
  2. /*----------------------------------------------------------------------*
  3.  * GETDISPLAY.C  Support routines for reading/displaying ILBM files.
  4.  * (IFF is Interchange Format File.)
  5.  *
  6.  * Based on code by Jerry Morrison and Steve Shaw, Electronic Arts.
  7.  * This software is in the public domain.
  8.  * Modified for iffparse.library by CBM 04/90
  9.  * This version for the Commodore-Amiga computer.
  10.  *
  11.  * 37.9  04/92 - use vp->ColorMap->Count instead of MAXAMCOLORREG
  12.  *----------------------------------------------------------------------*/
  13. #define INTUI_V36_NAMES_ONLY
  14.  
  15. #include "iffp/ilbm.h"
  16. #include "iffp/packer.h"
  17. #include "iffp/ilbmapp.h"
  18.  
  19. extern struct Library *GfxBase;
  20.  
  21. /* showilbm
  22.  *
  23.  * Passed an ILBMInfo initilized with with a not-in-use ParseInfo.iff
  24.  *   IFFHandle and desired propchks, collectchks, stopchks, and a filename,
  25.  *   will load and display an ILBM, initializing ilbm->Bmhd, ilbm->camg,
  26.  *   ilbm->scr, ilbm->win, ilbm->vp, ilbm->srp, ilbm->wrp,
  27.  *   ilbm->colortable, and ilbm->ncolors.
  28.  *
  29.  *   Note that ncolors may be more colors than you can LoadRGB4.
  30.  *   Use MIN(ilbm->ncolors,vp->ColorMap->Count) for color count if you
  31.  *   change the colors yourself using 1.3/2.0 functions.
  32.  *
  33.  * Returns 0 for success or an IFFERR (libraries/iffparse.h)
  34.  */
  35.  
  36. LONG showilbm(struct ILBMInfo *ilbm, UBYTE *filename)
  37. {
  38. LONG error = 0L;
  39.  
  40.     if(!(ilbm->ParseInfo.iff))    return(CLIENT_ERROR);
  41.  
  42.     if(!(error = openifile((struct ParseInfo *)ilbm, filename, IFFF_READ)))
  43.     {
  44.     D(bug("showilbm: openifile successful\n"));
  45.  
  46.     error = parseifile((struct ParseInfo *)ilbm,
  47.                 ID_FORM, ID_ILBM,
  48.                 ilbm->ParseInfo.propchks,
  49.                 ilbm->ParseInfo.collectchks,
  50.                 ilbm->ParseInfo.stopchks);
  51.  
  52.     if((!error)||(error == IFFERR_EOC)||(error == IFFERR_EOF))
  53.         {
  54.         D(bug("showilbm: parseifile successful\n"));
  55.  
  56.         if(contextis(ilbm->ParseInfo.iff,ID_ILBM,ID_FORM))
  57.         {
  58.             if(error = createdisplay(ilbm))
  59.             {
  60.             deletedisplay(ilbm);
  61.             }
  62.         }
  63.         else
  64.         {
  65.         message(SI(MSG_IFFP_NOILBM));
  66.         error = NOFILE;
  67.         }
  68.         }
  69.     if(error)    closeifile((struct ParseInfo *)ilbm);
  70.     }
  71.     return(error);
  72. }
  73.  
  74.  
  75. /* unshowilbm
  76.  *
  77.  * frees and closes everything alloc'd/opened by showilbm
  78.  * returns BOOL Success under V36 and above, always TRUE under <V36
  79.  */
  80. BOOL unshowilbm(struct ILBMInfo *ilbm)
  81. {
  82.     if(deletedisplay(ilbm))
  83.         {
  84.         closeifile((struct ParseInfo *)ilbm);
  85.         return(TRUE);
  86.         }
  87.     else return(FALSE);
  88. }
  89.  
  90.  
  91.  
  92. /* createdisplay
  93.  *
  94.  * Passed a initialized ILBMInfo with parsed IFFHandle (chunks parsed,
  95.  * stopped at BODY),
  96.  * opens/allocs the display and colortable, and displays the ILBM.
  97.  *
  98.  * If successful, sets up ilbm->Bmhd, ilbm->camg, ilbm->scr, ilbm->win,
  99.  *   ilbm->vp,  ilbm->wrp, ilbm->srp and also ilbm->colortable and
  100.  *   ilbm->ncolors.
  101.  *
  102.  * Note that ncolors may be more colors than you can LoadRGB4.
  103.  *   Use MIN(ilbm->ncolors,vp->ColorMap->Count) for color count if you
  104.  *   change the colors yourself using 1.3/2.0 functions.
  105.  *
  106.  * Returns 0 for success or an IFFERR (libraries/iffparse.h)
  107.  */
  108.  
  109. LONG createdisplay(struct ILBMInfo *ilbm)
  110.     {
  111.     int error;
  112.  
  113.     D(bug("createdisplay:\n"));
  114.  
  115.     error             = getdisplay(ilbm);
  116.  
  117.     D(bug("createdisplay: after getdisplay, error = %ld\n", error));
  118.  
  119.     if(!error)     error     = loadbody(ilbm->ParseInfo.iff,
  120.                         &ilbm->scr->BitMap,&ilbm->Bmhd);
  121.  
  122.     D(bug("createdisplay: after loadbody, error = %ld\n", error));
  123.  
  124.     if(!error)
  125.         { 
  126.         if(!(getcolors(ilbm)))
  127.            LoadRGB4(ilbm->vp, ilbm->colortable,
  128.                 MIN(ilbm->ncolors,ilbm->vp->ColorMap->Count));
  129.         }
  130.     if(error)  deletedisplay(ilbm);
  131.     return(error);
  132.     }
  133.  
  134.  
  135. /* deletedisplay
  136.  *
  137.  * closes and deallocates created display and colors
  138.  * returns BOOL Success under V36 and above, always TRUE under <V36
  139.  */
  140. BOOL deletedisplay(struct ILBMInfo *ilbm)
  141.     {
  142.     if(freedisplay(ilbm))
  143.         {
  144.         freecolors(ilbm);
  145.         return(TRUE);
  146.         }
  147.     else return(FALSE);
  148.     }
  149.  
  150.  
  151.  
  152. /* getdisplay
  153.  *
  154.  * Passed an initialized ILBMInfo with a parsed IFFHandle (chunks parsed,
  155.  * stopped at BODY),
  156.  * gets the dimensions and mode for the display and calls the external
  157.  * routine opendisplay().  Our opendisplay() is in the screen.c
  158.  * module.  It opens a 2.0 or 1.3, ECS or non-ECS screen and window.
  159.  * It also does 2.0 overscan centering based on the closest user prefs.
  160.  *
  161.  * If successful, sets up ilbm->Bmhd, ilbm->camg, ilbm->scr, ilbm->win,
  162.  *   ilbm->vp, ilbm->wrp, ilbm->srp
  163.  *
  164.  * Returns 0 for success or an IFFERR (libraries/iffparse.h)
  165.  */
  166. LONG getdisplay(struct ILBMInfo *ilbm)
  167.     {
  168.     struct IFFHandle *iff;
  169.     BitMapHeader *bmhd;
  170.     ULONG                modeid;
  171.     UWORD                wide, high, deep;
  172.  
  173.  
  174.     if(!(iff=ilbm->ParseInfo.iff))    return(CLIENT_ERROR);
  175.  
  176.     if(!(bmhd = (BitMapHeader *)findpropdata(iff, ID_ILBM, ID_BMHD)))
  177.         {
  178.         message (SI(MSG_IFFP_NOBMHD));
  179.         return(IFFERR_SYNTAX);
  180.         }
  181.  
  182.     *(&ilbm->Bmhd)    = *bmhd;
  183.  
  184.         wide = (RowBytes(bmhd->w)) >= (RowBytes(bmhd->pageWidth)) ?
  185.                 bmhd->w : bmhd->pageWidth;
  186.         high = MAX(bmhd->h, bmhd->pageHeight);
  187.         deep = MIN(bmhd->nPlanes,MAXAMDEPTH);
  188.  
  189.     ilbm->camg = modeid = getcamg(ilbm);
  190.  
  191.     /*
  192.      * Open the display
  193.      */
  194.     if(!(opendisplay(ilbm,wide,high,deep,modeid)))
  195.         {
  196.         message(SI(MSG_IFFP_NODISPLAY));
  197.         return(1);
  198.         }
  199.     return(0);
  200.     }
  201.  
  202.  
  203. /* freedisplay
  204.  *
  205.  * closes and deallocates display from getdisplay (not colors)
  206.  * returns BOOL Success under V36 and above, always TRUE under <V36
  207.  */
  208. BOOL freedisplay(struct ILBMInfo *ilbm)
  209.     {
  210.     return(closedisplay(ilbm));
  211.     }
  212.